home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / gepackte_disketten / 1994 / 08_94_5.dms / 08_94_5.adf / term-4.0-Source.lha / termPickScreen.c < prev    next >
C/C++ Source or Header  |  1994-06-26  |  5KB  |  283 lines

  1. /*
  2. **    termPickScreen.c
  3. **
  4. **    Simplified public screen selection routine
  5. **
  6. **    Copyright © 1990-1994 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_LIST=1,GAD_USE,GAD_CANCEL };
  13.  
  14.     /* BuildScreenList():
  15.      *
  16.      *    Build a private copy of the public screen list.
  17.      */
  18.  
  19. STATIC struct List *
  20. BuildScreenList(VOID)
  21. {
  22.     struct List *List,*PubScreenList;
  23.  
  24.         /* Get the list body. */
  25.  
  26.     if(List = (struct List *)AllocVecPooled(sizeof(struct List),MEMF_ANY))
  27.     {
  28.         NewList(List);
  29.  
  30.             /* Get access to the public screen list. */
  31.  
  32.         if(PubScreenList = LockPubScreenList())
  33.         {
  34.             struct Node *Next,*Node;
  35.  
  36.             Node = PubScreenList -> lh_Head;
  37.  
  38.                 /* Scan the list. */
  39.  
  40.             while(Next = Node -> ln_Succ)
  41.             {
  42.                     /* Don't include the current `term' public
  43.                      * screen name in it.
  44.                      */
  45.  
  46.                 if(strcmp(Node -> ln_Name,TermIDString))
  47.                 {
  48.                     struct Node *New = CreateNode(Node -> ln_Name);
  49.  
  50.                         /* Got a new node? */
  51.  
  52.                     if(New)
  53.                         AddTail(List,New);
  54.                 }
  55.  
  56.                 Node = Next;
  57.             }
  58.  
  59.             UnlockPubScreenList();
  60.         }
  61.  
  62.             /* In case the list happens to remain empty,
  63.              * include the Workbench screen in it.
  64.              */
  65.  
  66.         if(!List -> lh_Head -> ln_Succ)
  67.         {
  68.             struct Node *New = CreateNode("Workbench");
  69.  
  70.             if(New)
  71.                 AddTail(List,New);
  72.             else
  73.             {
  74.                 FreeVecPooled(List);
  75.  
  76.                 List = NULL;
  77.             }
  78.         }
  79.     }
  80.  
  81.     return(List);
  82. }
  83.  
  84.     /* PickScreen(STRPTR Name):
  85.      *
  86.      *    Your nice public screen selection routine.
  87.      */
  88.  
  89. BYTE __regargs
  90. PickScreen(struct Window *Window,STRPTR Name)
  91. {
  92.     struct List    *ScreenList;
  93.     BYTE         Result = FALSE;
  94.  
  95.     if(ScreenList = BuildScreenList())
  96.     {
  97.         struct LayoutHandle *Handle;
  98.     
  99.         if(Handle = LT_CreateHandleTags(Window -> WScreen,
  100.             LH_LocaleHook,    &LocaleHook,
  101.         TAG_DONE))
  102.         {
  103.             struct Window    *Window;
  104.             ULONG         Index = (ULONG)~0,i;
  105.             struct Node    *Node;
  106.  
  107.             for(Node = ScreenList -> lh_Head, i = 0 ; Node -> ln_Succ ; Node = Node -> ln_Succ, i++)
  108.             {
  109.                 if(!strcmp(Node -> ln_Name,Name))
  110.                 {
  111.                     Index = i;
  112.  
  113.                     break;
  114.                 }
  115.             }
  116.  
  117.             LT_New(Handle,
  118.                 LA_Type,    VERTICAL_KIND,
  119.             TAG_DONE);
  120.             {
  121.                 LT_New(Handle,
  122.                     LA_Type,    VERTICAL_KIND,
  123.                     LA_LabelID,    MSG_V36_1271,
  124.                 TAG_DONE);
  125.                 {
  126.                     LT_New(Handle,
  127.                         LA_Type,    LISTVIEW_KIND,
  128.                         LA_LabelID,    MSG_TERMPICKSCREEN_SCREEN_LIST_GAD,
  129.                         LA_Chars,    40,
  130.                         LA_ID,        GAD_LIST,
  131.                         LA_Lines,    10,
  132.                         LALV_MaxGrowY,    20,
  133.                         GTLV_Labels,    ScreenList,
  134.                         GTLV_Selected,    Index,
  135.                         LALV_Link,    NIL_LINK,
  136.                         LALV_CursorKey,    TRUE,
  137.                     TAG_DONE);
  138.     
  139.                     LT_EndGroup(Handle);
  140.                 }
  141.     
  142.                 LT_New(Handle,
  143.                     LA_Type,VERTICAL_KIND,
  144.                 TAG_DONE);
  145.                 {
  146.                     LT_New(Handle,
  147.                         LA_Type,    XBAR_KIND,
  148.                         LAXB_FullSize,    TRUE,
  149.                     TAG_DONE);
  150.     
  151.                     LT_EndGroup(Handle);
  152.                 }
  153.  
  154.                 LT_New(Handle,LA_Type,HORIZONTAL_KIND,
  155.                     LAGR_SameSize,    TRUE,
  156.                     LAGR_Spread,    TRUE,
  157.                 TAG_DONE);
  158.                 {
  159.                     LT_New(Handle,
  160.                         LA_Type,    BUTTON_KIND,
  161.                         LA_LabelID,    MSG_GLOBAL_USE_GAD,
  162.                         LA_ID,        GAD_USE,
  163.                         LABT_ReturnKey,    TRUE,
  164.                         LABT_ExtraFat,    TRUE,
  165.                     TAG_DONE);
  166.     
  167.                     LT_New(Handle,
  168.                         LA_Type,    BUTTON_KIND,
  169.                         LA_LabelID,    MSG_GLOBAL_CANCEL_GAD,
  170.                         LA_ID,        GAD_CANCEL,
  171.                         LABT_EscKey,    TRUE,
  172.                         LABT_ExtraFat,    TRUE,
  173.                     TAG_DONE);
  174.     
  175.                     LT_EndGroup(Handle);
  176.                 }
  177.     
  178.                 LT_EndGroup(Handle);
  179.             }
  180.     
  181.             if(Window = LT_Layout(Handle,LocaleString(MSG_TERMPICKSCREEN_SCREENS_TXT),NULL,0,0,IDCMP_CLOSEWINDOW,0,
  182.                 LAWN_HelpHook,        &GuideHook,
  183.                 WA_DepthGadget,        TRUE,
  184.                 WA_CloseGadget,        TRUE,
  185.                 WA_DragBar,        TRUE,
  186.                 WA_RMBTrap,        TRUE,
  187.                 WA_Activate,        TRUE,
  188.             TAG_DONE))
  189.             {
  190.                 struct IntuiMessage    *Message;
  191.                 BOOLEAN             Done = FALSE;
  192.                 ULONG             MsgClass,
  193.                              MsgQualifier;
  194.                 UWORD             MsgCode;
  195.                 struct Gadget        *MsgGadget;
  196.  
  197.                 LT_ShowWindow(Handle,TRUE);
  198.  
  199.                 PushWindow(Window);
  200.     
  201.                 do
  202.                 {
  203.                     if(Wait(PORTMASK(Window -> UserPort) | SIG_BREAK) & SIG_BREAK)
  204.                         break;
  205.     
  206.                     while(Message = (struct IntuiMessage *)GT_GetIMsg(Window -> UserPort))
  207.                     {
  208.                         MsgClass    = Message -> Class;
  209.                         MsgQualifier    = Message -> Qualifier;
  210.                         MsgCode        = Message -> Code;
  211.                         MsgGadget    = (struct Gadget *)Message -> IAddress;
  212.     
  213.                         GT_ReplyIMsg(Message);
  214.     
  215.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  216.     
  217.                         if(MsgClass == IDCMP_CLOSEWINDOW)
  218.                             Done = TRUE;
  219.     
  220.                         if(MsgClass == IDCMP_GADGETUP)
  221.                         {
  222.                             switch(MsgGadget -> GadgetID)
  223.                             {
  224.                                 case GAD_USE:
  225.  
  226.                                     if(Index != (ULONG)~0)
  227.                                     {
  228.                                         struct Node *Node = GetListNode(Index,ScreenList);
  229.  
  230.                                         if(Node)
  231.                                         {
  232.                                             strcpy(Name,Node -> ln_Name);
  233.  
  234.                                             Result = TRUE;
  235.                                         }
  236.                                     }
  237.  
  238.                                     Done = TRUE;
  239.                                     break;
  240.     
  241.                                 case GAD_CANCEL:
  242.     
  243.                                     Done = TRUE;
  244.                                     break;
  245.  
  246.                                 case GAD_LIST:
  247.  
  248.                                     Index = MsgCode;
  249.                                     break;
  250.                             }
  251.                         }
  252.  
  253.                         if(MsgClass == IDCMP_IDCMPUPDATE)
  254.                         {
  255.                             struct Node *Node = GetListNode(Index = MsgCode,ScreenList);
  256.  
  257.                             if(Node)
  258.                             {
  259.                                 strcpy(Name,Node -> ln_Name);
  260.  
  261.                                 Done = Result = TRUE;
  262.  
  263.                                 LT_PressButton(Handle,GAD_USE);
  264.                             }
  265.                         }
  266.                     }
  267.                 }
  268.                 while(!Done);
  269.     
  270.                 PopWindow();
  271.             }
  272.     
  273.             LT_DeleteHandle(Handle);
  274.         }
  275.  
  276.         DeleteList(ScreenList);
  277.     }
  278.     else
  279.         DisplayBeep(Window -> WScreen);
  280.  
  281.     return(Result);
  282. }
  283.